/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package baseDatos;

import entidades.Bateria;
import entidades.Camara;
import entidades.Jaula;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.logging.Level;
import java.util.logging.Logger;
import oracle.sql.ARRAY;

/**
 *
 * @author Facundo
 */
public class CamaraDAO {

    private String query;
    private Connection conDB;
    private PreparedStatement pst;

    public CamaraDAO(Connection con) {
        this.conDB = con;
    }

    // public AnimalDAO(String nombre) {
    //   super(nombre);
    //}
    public CamaraDAO() {
    }

    /**
     * @return the query
     */
    public String getQuery() {
        return query;
    }

    /**
     * @param query the query to set
     */
    public void setQuery(String query) {
        this.query = query;
    }

    /**
     * @return the conDB
     */
    public Connection getConDB() {
        return conDB;
    }

    /**
     * @param conDB the conDB to set
     */
    public void setConDB(Connection conDB) {
        this.conDB = conDB;
    }

    /**
     * @return the pst
     */
    public PreparedStatement getPst() {
        return pst;
    }

    /**
     * @param pst the pst to set
     */
    public void setPst(PreparedStatement pst) {
        this.pst = pst;
    }

    /*
     * Metodo que devuelve un objeto camara de acuerdo a su nombre y tipo de camara
     */
    public Camara getCamara(int codigoTipoCamara, String nombre) {
        Camara cam = null;
        setQuery("select * from PC_CAMARA where nombre='" + nombre + "' and codigo_tipo_camara=" + codigoTipoCamara);
        cam = this.devolverCamara(nombre);
        return cam;
    }

    /*
     * Metodo que retorna una sola camara de acuerdo a su codigo
     */
    public Camara getCamara(int codigo) {
        Camara cam = null;
        setQuery("select * from PC_CAMARA where codigo_camara=" + codigo);
        cam = this.devolverCamara(getQuery());
        return cam;
    }

    /*
     * metodo que devuelve una determinada camara de acuerdo a la sentencia que viene de parametro
     */
    private Camara devolverCamara(String sentencia) {
        Camara cam = null;
        ResultSet rs = null;
        setQuery(sentencia);
        try {
            setPst(getConDB().prepareStatement(getQuery()));
            rs = getPst().executeQuery();
            while (rs.next()) {
                cam = new Camara();
                cam.setNombre(rs.getString("nombre"));
                if (rs.getString("descripcion") != null) {
                    cam.setDescripcion(rs.getString("descripcion"));
                }
                cam.setTipo_camara(new TipoCamaraDAO(this.getConDB()).getTipoCamara((rs.getInt("codigo_tipo_camara"))));
                cam.setBateria(new BateriaDAO(this.getConDB()).getBaterias(rs.getInt("codigo_camara")));
            }
            getPst().close();
            rs.close();
        } catch (SQLException ex) {
            Logger.getLogger(CamaraDAO.class.getName()).log(Level.SEVERE, null, ex);
        }
        return cam;
    }

    /*
     * Metodo que devuelve un array de camaras
     */
    public ArrayList getCamaras() {
        ArrayList camaras = null;
        setQuery("select * from PC_CAMARA");
        camaras = this.devolverCamaras(getQuery());
        return camaras;
    }

    /*
     * Metodo que devuelve un array con de camaras, de acuerdo a la sentencia que viene de parametro
     */
    private ArrayList devolverCamaras(String sentencia) {
        ArrayList todos = null;
        Camara cam = null;

        try {
            todos = new ArrayList();
            ResultSet rs;
            setQuery(sentencia);
            setPst(getConDB().prepareStatement(getQuery()));
            rs = getPst().executeQuery();
            while (rs.next()) {

                cam = new Camara();
                cam.setNombre(rs.getString("nombre"));
                if (rs.getString("descripcion") != null) {
                    cam.setDescripcion(rs.getString("descripcion"));
                }
                cam.setTipo_camara(new TipoCamaraDAO(this.getConDB()).getTipoCamara((rs.getInt("codigo_tipo_camara"))));
                cam.setBateria(new BateriaDAO(this.getConDB()).getBaterias(rs.getInt("codigo_camara")));
                todos.add(cam);
            }
            rs.close();
            getPst().close();
        } catch (SQLException ex) {
            Logger.getLogger(CamaraDAO.class.getName()).log(Level.SEVERE, null, ex);
        }
        return todos;
    }


    /*
     * Metodo que devuelve un array de camaras de acuerdo al tipo, con sus respectivas baterias,
     * con sus respectivas jaulas de acuerdo a un estado.
     * Parametros de entrada el tipo de camara (codigo de tipo int) y estado de jaula (codigo de tipo int)
     */
    public ArrayList allCamarasBateriaJaula(int tipoCamara, int estadoJaula) {
        try {
            ArrayList todos = null;
            Camara cam = null;
            todos = new ArrayList();
            ResultSet rs;

            setQuery("select * from PC_CAMARA where codigo_tipo_camara=" + tipoCamara);
            System.out.println("Sentencia que devuelve todas las camaras segun el tipo de camara: " + this.getQuery());
            setPst(getConDB().prepareStatement(getQuery()));
            rs = getPst().executeQuery();
            while (rs.next()) {
                cam = new Camara();
                cam.setNombre(rs.getString("nombre"));
                if (rs.getString("descripcion") != null) {
                    cam.setDescripcion(rs.getString("descripcion"));
                }
                cam.setTipo_camara(new TipoCamaraDAO(this.getConDB()).getTipoCamara(rs.getInt("codigo_tipo_camara")));
                cam.setBateria(new BateriaDAO(this.getConDB()).allCamaraBateriaJaula(rs.getInt("codigo_camara"), estadoJaula));
                if (cam.getTipo_camara() == null || cam.getBateria() == null || cam.getBateria().isEmpty() == true) {
                    System.out.println("para q no salga para aca hay que crear todo la estructura para la camara2 de maduracion!, y ahi va a andar bien");
                    return null;
                }
                todos.add(cam);
            }
            rs.close();
            getPst().close();
            return todos;
        } catch (SQLException ex) {
            Logger.getLogger(CamaraDAO.class.getName()).log(Level.SEVERE, null, ex);
        }
        return null;
    }

    public ArrayList allCamaraLibreMaduracion() {
        try {
            String sql = "SELECT jau.nombre,jau.codigo_jaula, bat.codigo_bateria, cam.codigo_camara FROM pc_jaula jau, pc_bateria bat, pc_camara cam " + "WHERE  jau.codigo_bateria=bat.codigo_bateria " + "AND bat.codigo_camara=cam.codigo_camara " + "and cam.codigo_tipo_camara=( SELECT TC.CODIGO_TIPO FROM pc_tipo_camara tc WHERE tc.nombre='MADURACION') " + "AND jau.codigo_estado = ( SELECT codigo_estado FROM pc_estado_jaula WHERE nombre='LIBRE') ";
            System.out.println("Sentencia para traer las ubicaciones en maduracion: "+sql);
            this.setPst(this.getConDB().prepareStatement(sql));
            ResultSet rs = this.getPst().executeQuery();
            Camara cam = null;
            Bateria bat = null;
            Jaula jau = null;
            ArrayList res_jaulasDisponibles = new ArrayList();
            ArrayList res_bateria = new ArrayList();
            ArrayList res_camara=new ArrayList();
            int cod_jaula = 0, cod_bateria = 0, cod_camara = 0;
            boolean paso = false;
            while (rs.next()) {
                cod_jaula = rs.getInt("codigo_jaula");
                jau = new JaulaDAO(this.getConDB()).getJaula(cod_jaula);
                res_jaulasDisponibles.add(jau);
                if (cod_bateria != rs.getInt("codigo_bateria")) {
                    cod_bateria = rs.getInt("codigo_bateria");
                    bat = new BateriaDAO(this.getConDB()).getBateria(cod_bateria);
                    bat.setJaula(res_jaulasDisponibles);
                    res_bateria.add(bat);
                    if (cod_camara != rs.getInt("codigo_camara")) {
                        cod_camara = rs.getInt("codigo_camara");
                        cam = new CamaraDAO(this.getConDB()).getCamara(cod_camara);
                        cam.setBateria(res_bateria);
                        res_camara.add(cam);
                    }
                }
            }
            rs.close();
            this.getPst().close();
            return res_camara;
        } catch (SQLException ex) {
            Logger.getLogger(CamaraDAO.class.getName()).log(Level.SEVERE, null, ex);
        }
        return null;
    }

    /*
     * Metodo que me devuelve el codigo de una Camara de acuerdo a su nombre y tipo de camara     *
     */
    public int getCodigoCamara(String nombre, int codigoTipoCamara) {
        int cod = -1;
        ResultSet rs = null;
        setQuery("select codigo_camara from PC_CAMARA where nombre='" + nombre + "' and codigo_tipo_camara=" + codigoTipoCamara);
        try {
            setPst(getConDB().prepareStatement(getQuery()));
            rs = getPst().executeQuery();
            while (rs.next()) {
                cod = rs.getInt("codigo_camara");
            }
            getPst().close();
            rs.close();
        } catch (SQLException ex) {
            Logger.getLogger(AnimalDAO.class.getName()).log(Level.SEVERE, null, ex);
        }
        return cod;
    }
}
